import {defineStore} from "pinia";
import Storage from 'good-storage';

// 第一个参数是你的应用中 Store 的唯一 ID。
export const useSharedStore2 = defineStore('shared', {
    state: () => ({
        // 控制登录弹窗显示/隐藏
        showLoginDialog: false,
        // 聊天列表样式（默认'chat'）
        chatListStyle: Storage.get('chat_list_style', 'chat'),
        // 是否启用实时聊天流（默认true）
        chatStream: Storage.get('chat_stream', true),
        // WebSocket 连接对象及事件处理器
        socket: {
            conn: null,
            handlers: {},
            eventHandler: null, // 统一的事件处理器
            handlerProxies: {}, // 存储处理函数的代理引用
        },
        // 移动端主题（默认'light'）
        mobileTheme: Storage.get('mobile_theme', 'light'),
        // 管理端主题（默认'light'）
        adminTheme: Storage.get('admin_theme', 'light'),
        // 用户登录状态
        isLogin: false
    }),
    getters: {},
    actions: {
        setShowLoginDialog(value) {
            this.showLoginDialog = value
        },
        setChatListStyle(value) {
            this.chatListStyle = value
            Storage.set('chat_list_style', value)
        },
        setChatStream(value) {
            this.chatStream = value
            Storage.set('chat_stream', value)
        },
        /*-------------------------websocket------------------------*/
        // 设置websocket连接
        setSocket(value) {
            // 清理旧连接的事件监听
            this.removeSocketEventListeners()
            // 设置新的连接
            this.socket.conn = value
            // 如果存在处理函数，设置新的监听
            if (Object.values(this.socket.handlers).length > 0){
                this.setSocketEventHandler()
            }
        },
        // 添加消息处理函数
        addMessageHandler(key, callback) {
            // 已经存在的函数不重复添加
            if (this.socket.handlers[key]) return
            // 保存函数的引用
            this.socket.handlers[key] = callback
            // 存储代理引用用于移除
            this.socket.handlerProxies[key] = callback
            // 设置事件监听
            this.setSocketEventHandler()
        },
        // 移除websocket连接监听的事件和注册的回调函数
        removeMessageHandler(key) {
            // 移除处理函数的引用
            delete this.socket.handlers[key]
            delete this.socket.handlerProxies[key]
            // 如果没有其它处理函数，移除事件监听器
            if (Object.values(this.socket.handlers).length === 0) {
                this.removeSocketEventListeners()
            }
        },
        // 设置统一的事件处理器
        setSocketEventHandler() {
            // 如果已经设置了事件处理器或没有连接，直接返回
            if (!this.socket.conn || this.socket.eventHandler) return;
            // 创建统一的事件处理器
            this.socket.eventHandler = async (event) => {
                try {
                    let parsedData
                    // 处理 Blob 数据
                    if (event.data instanceof Blob) {
                        parsedData = await this.blobToJson(event.data)
                    } else if (typeof event.data === 'string') { // 处理文本数据
                        parsedData = JSON.parse(event.data)
                    }
                    // 分发给所有注册的处理函数
                    Object.values(this.socket.handlerProxies).forEach(cb => {
                        try {
                            cb(parsedData)
                        } catch (e) {
                            console.error('Handler error', e);
                        }
                    })
                } catch (e) {
                    console.warn('Message parse error', e);
                }
            }
            // 添加事件监听
            this.socket.conn.addEventListener('message', this.socket.eventHandler)
        },
        // 移除事件监听器
        removeSocketEventListeners() {
            if (this.socket.conn && this.socket.eventHandler) {
                this.socket.conn.removeEventListener('message', this.socket.eventHandler)
                this.socket.eventHandler = null
            }
        },
        // Blob 转 JSON 的辅助方法
        async blobToJson(blob) {
            return new Promise((resolve) => {
                const reader = new FileReader()
                reader.onload = () => {
                    try {
                        resolve(JSON.parse(reader.result))
                    } catch (e) {
                        console.warn('Blob parse error', e);
                        resolve(null);
                    }
                }
                reader.readAsText(blob, 'UTF-8')
            })
        },
        /*-------------------------websocket------------------------*/
        setMobileTheme(theme) {
            this.mobileTheme = theme
            Storage.set('mobile_theme', theme)
        },
        setAdminTheme(theme) {
            this.adminTheme = theme
            Storage.set('admin_theme', theme)
        },
        setIsLogin(val) {
            this.isLogin = val
        }
    }
})